package trim.calc;

import java.io.IOException;
import java.io.InputStream;
import trim.TrimException;
import trim.common.bp.BPException;
import trim.common.bp.BestPartition;
import trim.common.inputdata.InputData;
import trim.common.result.TrimResult;
import trim.common.sm.SMException;
import trim.common.sm.TrimSimplex;

/**
 * ExtentionCombMethodTrim.java
 * СМ+расширенный СМ+перебор
 * Created on 19.11.2008 22:39:23
 * @author Саковнич Дмитрий
 */
public class ExtentionCombMethodTrim extends SMExtensionTrim
{
  public ExtentionCombMethodTrim()
  {
  }

  @Override
  public TrimResult solve(InputData inputData) throws TrimException
  {
    try {
      inputData=inputData.clone();
      TrimSimplex sm=extensionSimplex(inputData);

      TrimResult tr=sm.getTrimResult();
      inputData.getFormatOrderList().clear();
      inputData.getFormatOrderList().addAll(sm.getRestFormatCount());
      inputData.getFormatOrderList().remove(inputData.getFormatOrderList().size()-1);
      int lt=sm.getRestMaterials();
      tr.addAll(new BestPartition(inputData).solve(lt));
      return tr;
    }
    catch (BPException ex) {
      throw new TrimException("Error in BP",ex);
    }
    catch (SMException ex) {
      throw new TrimException("Error in SM",ex);
    }
  }

  @Override
  public String getName()
  {
    return this.getClass().getSimpleName();
  }

  @Override
  public String getVersion()
  {
    InputStream is=getClass().getResourceAsStream("/trim/calc/version");
    byte[] b=new byte[20];
    try {
      int n=is.read(b);
      return new String(b,0,n);
    }
    catch (IOException ex) {
      ex.printStackTrace();
      return "0";
    }
  }

  @Override
  public String getDescription()
  {
    return "Комбинированный алгоритм решения ЗФР с " +
          "расширенным СМ";
  }
}
